package Leetcode第一期;
/*

地上有一个m行n列的方格，从坐标 [0,0] 到坐标 [m-1,n-1] 。一个机器人从坐标 [0, 0] 的格子开始移动，它每次可以向左、右、上、下移动一格（不能移动到方格外），也不能进入行坐标和列坐标的数位之和大于k的格子。例如，当k为18时，机器人能够进入方格 [35, 37] ，因为3+5+3+7=18。但它不能进入方格 [35, 38]，因为3+5+3+8=19。请问该机器人能够到达多少个格子？
示例 1：

输入：m = 2, n = 3, k = 1
输出：3
示例 2：

输入：m = 3, n = 1, k = 0
输出：1
提示：

1 <= n,m <= 100
0 <= k <= 20
 */
public class 机器人的运动范围_13 {
    //计算位数和
    /*public int digitalSum(int i) {
        int sum = 0;
        while (i > 0) {
            sum += i % 10;
            i /= 10;
        }
        return sum;
    }
*/
    boolean[][] visited;

    //判断递归出口
   /* public boolean symbol(int i, int j, int m, int n, int k,boolean[][] visited) {
        if (i < 0 || j < 0 || i >= m || j >= n || (digitalSum(i) + digitalSum(j)) > k||visited[i][j]==true) {
            return true;
        } else {
            return false;
        }
    }

    public int dfsSolver(int i, int j, int m, int n, int k, boolean[][] visited) {
        if (symbol(i, j, m, n, k,visited)) {
            return 0;
        }
        visited[i][j] = true;
        return 1 + dfsSolver(i+1, j, m, n, k, visited)
                //+ dfsSolver(i-1, j, m, n, k, visited)
                + dfsSolver(i, j+1, m, n, k, visited)
               // + dfsSolver(i, j-1, m, n, k, visited)
                ;
        //由于只需朝下方或者朝右方搜索 则可以排除上和左方向
    }

    public int movingCount(int m, int n, int k) {
        this.visited=new boolean[m][n];
        int ans = dfsSolver(0, 0, m, n, k, visited);
        return ans;
    }*/

    public int movingCount(int m, int n, int k) {
        this.visited=new boolean[m][n];
        //参数说明 当前位置索引，矩阵范围，位相加不能大于k值,访问标志矩阵
        return dfsSolver(0,0,m,n,k,visited);
    }

    private int dfsSolver(int i, int j, int m, int n, int k, boolean[][] visited) {
        if (isArea(i,j,m,n,k,visited)) {
            //在范围内则对四个方向进行递归 结果相加
            //只需要右方和下方
            visited[i][j]=true;
            return 1 + dfsSolver(i+1, j, m, n, k, visited)
                    //+ dfsSolver(i-1, j, m, n, k, visited)
                    + dfsSolver(i, j+1, m, n, k, visited)
                    // + dfsSolver(i, j-1, m, n, k, visited)
                    ;
        }
        //不在范围则返回0;
        return 0;
    }

    private boolean isArea(int i, int j, int m, int n, int k, boolean[][] visited) {
        return i>=0 && i<m && j>=0 && j<n && digitalSum(i)+digitalSum(j)<=k && visited[i][j]==false;
    }

    public int digitalSum(int i) {
        int sum = 0;
        while (i > 0) {
            sum += i % 10;
            i /= 10;
        }
        return sum;
    }

    public static void main(String[] args) {
        int n=10;
        double m=n/3;
        double x=n%3;
        int ans= (int) (Math.pow(3, m) * x);
    }
}
